[SiteStatsUpdate] Changing raw DB update calls to use SiteStatsUpdate.
authorAaron <aschulz@wikimedia.org>
Wed, 9 May 2012 20:59:27 +0000 (13:59 -0700)
committerAaron <aschulz@wikimedia.org>
Wed, 9 May 2012 21:17:56 +0000 (14:17 -0700)
* Made SiteStatsUpdate fields protected
* Added factory function for unretarded object construction
* Changed FileRepo code to use deferred stats updates like everything else

Change-Id: I93039104b14f0362509e37b6852604ffb0898dc7

includes/SiteStats.php
includes/filerepo/file/LocalFile.php

index abb1130..b557ca2 100644 (file)
@@ -223,15 +223,37 @@ class SiteStats {
  * Class for handling updates to the site_stats table
  */
 class SiteStatsUpdate implements DeferrableUpdate {
+       protected $views = 0;
+       protected $edits = 0;
+       protected $pages = 0;
+       protected $goodPages = 0;
+       protected $users = 0;
+       protected $images = 0;
+
+       // @TODO: deprecate this
+       function __construct( $views, $edits, $good, $pages = 0, $users = 0 ) {
+               $this->views = $views;
+               $this->edits = $edits;
+               $this->goodPages = $good;
+               $this->pages = $pages;
+               $this->users = $users;
+       }
+
+       /**
+        * @param $deltas Array
+        * @return SiteStatsUpdate
+        */
+       public static function factory( array $deltas ) {
+               $update = new self( 0, 0, 0 );
 
-       var $mViews, $mEdits, $mGood, $mPages, $mUsers;
+               $fields = array( 'views', 'edits', 'pages', 'goodPages', 'users', 'images' );
+               foreach ( $fields as $field ) {
+                       if ( isset( $deltas[$field] ) && $deltas[$field] ) {
+                               $update->$field = $deltas[$field];
+                       }
+               }
 
-       function __construct( $views, $edits, $good, $pages = 0, $users = 0 ) {
-               $this->mViews = $views;
-               $this->mEdits = $edits;
-               $this->mGood = $good;
-               $this->mPages = $pages;
-               $this->mUsers = $users;
+               return $update;
        }
 
        /**
@@ -252,16 +274,17 @@ class SiteStatsUpdate implements DeferrableUpdate {
                }
        }
 
-       function doUpdate() {
+       public function doUpdate() {
                $dbw = wfGetDB( DB_MASTER );
 
                $updates = '';
 
-               $this->appendUpdate( $updates, 'ss_total_views', $this->mViews );
-               $this->appendUpdate( $updates, 'ss_total_edits', $this->mEdits );
-               $this->appendUpdate( $updates, 'ss_good_articles', $this->mGood );
-               $this->appendUpdate( $updates, 'ss_total_pages', $this->mPages );
-               $this->appendUpdate( $updates, 'ss_users', $this->mUsers );
+               $this->appendUpdate( $updates, 'ss_total_views', $this->views );
+               $this->appendUpdate( $updates, 'ss_total_edits', $this->edits );
+               $this->appendUpdate( $updates, 'ss_good_articles', $this->goodPages );
+               $this->appendUpdate( $updates, 'ss_total_pages', $this->pages );
+               $this->appendUpdate( $updates, 'ss_users', $this->users );
+               $this->appendUpdate( $updates, 'ss_images', $this->images );
 
                if ( $updates ) {
                        $site_stats = $dbw->tableName( 'site_stats' );
index af93c53..e2744b1 100644 (file)
@@ -1094,16 +1094,8 @@ class LocalFile extends File {
                                __METHOD__
                        );
                } else {
-                       # This is a new file
-                       # Update the image count
-                       $dbw->begin( __METHOD__ );
-                       $dbw->update(
-                               'site_stats',
-                               array( 'ss_images = ss_images+1' ),
-                               '*',
-                               __METHOD__
-                       );
-                       $dbw->commit( __METHOD__ );
+                       # This is a new file, so update the image count
+                       DeferredUpdates::addUpdate( SiteStatsUpdate::factory( array( 'images' => 1 ) ) );
                }
 
                $descTitle = $this->getTitle();
@@ -1297,13 +1289,11 @@ class LocalFile extends File {
                # Get old version relative paths
                $archiveNames = $batch->addOlds();
                $status = $batch->execute();
+               $this->unlock(); // done
+
                if ( $status->isOK() ) {
-                       // Update site_stats
-                       $dbw = $this->repo->getMasterDB();
-                       $site_stats = $dbw->tableName( 'site_stats' );
-                       $dbw->query( "UPDATE $site_stats SET ss_images=ss_images-1", __METHOD__ );
+                       DeferredUpdates::addUpdate( SiteStatsUpdate::factory( array( 'images' => -1 ) ) );
                }
-               $this->unlock(); // done
 
                $this->purgeEverything();
                foreach ( $archiveNames as $archiveName ) {
@@ -2080,9 +2070,7 @@ class LocalFileRestoreBatch {
                        if ( !$exists ) {
                                wfDebug( __METHOD__ . " restored {$status->successCount} items, creating a new current\n" );
 
-                               // Update site_stats
-                               $site_stats = $dbw->tableName( 'site_stats' );
-                               $dbw->query( "UPDATE $site_stats SET ss_images=ss_images+1", __METHOD__ );
+                               DeferredUpdates::addUpdate( SiteStatsUpdate::factory( array( 'images' => 1 ) ) );
 
                                $this->file->purgeEverything();
                        } else {